package com.hb.C_Lambda表达式和集合.高阶函数


/**
 * 从第一个元素开始累加值，并从左到右对当前累加器值和每个元素应用运算。
 * 如果此集合为空，则引发异常。 如果集合可以按预期的方式为空，请改用reduceOrNull 。
 * 当其接收者为空时，它返回null.
 *

        //传进去的函数和reduce之后的返回值都是第一个参数
        public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S {
        val iterator = this.iterator()
        if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.")
        //先获取到集合中的第一个元素
        var accumulator: S = iterator.next()
        while (iterator.hasNext()) {
        //对集合中的元素进行传进来的函数功能操作,这里的iterator.next()于然是集合中的第二个元素了
        accumulator = operation(accumulator, iterator.next())
        }
        return accumulator
        }
 */
fun main() {
    println((0..5).reduce { total, item -> total + item })
        println("-----")

        val reduce = (1..5).reduce { total, item ->
                total + item
        }
        println("reduce $reduce")
        println("-----")


        //将(0..6)集合中的元素通过factorial函数处理之后输出新的集合
        println((0..6).map(::factorial).reduce { total, item ->
                total + item
        })



}

//求阶乘
fun factorial(n:Int):Int{
        if (n==0) return 1
        return (1..n).reduce{
                total,item -> total*item
        }
}